1、 内联汇编简介
	目前编译器都比较智能，能将 C 代码转换为高效率的汇编指令，但是对于某些特殊指令（如 ldrex 、 strex ）或特殊
算法编译器则无法正常转换，此时则需要使用汇编来实现相应的功能，如果不想创建单独的汇编文件则可以采用在C语言中嵌
入汇编指令的方式来实现。
2、 内联汇编的基本格式
	__asm__ asm-qualifiers (
		AssemblerTemplate
		:OutputOperands
		:InputOperands
		:Clobbers
	);
	__asm__ ：固定格式，表示这是一段内联汇编代码
	asm-qualifiers ：限定符，通常是 volatile ，表示不对此段内联汇编代码进行优化
	AssemblerTemplate ：汇编指令，如 “mov  %0, %1\n” ，每条指令都用 ” 括起来，并以 \n 或 \n\t 或 ; 结尾
	OutputOperands ：输出操作数，格式如下，当有多个变量时，用逗号隔开：
		[asmSymbolicName] “constraint” (cvariablename)
		[asmSymbolicName] ：符号名，与 C 代码中的变量名类似，在汇编中可以使用 %[result] 来引用这个操作数，此部
	分是可以省略的，若省略后再汇编中则通过 %n 来引用此操作数（n=0~+∞，为操作数出现的顺序）
		constraint ：参数约束，采用的取值如下：
			m ：表示要传入有效的地址
			r ：使用通用寄存器来保存这个操作数
			i ：表示可以传入一个立即数
		以上这些取值还可以加上下列修饰符：
			无 ：被修饰的操作符是只读的
			= ：被修饰的操作符只写
			+ ：被修饰的操作符可读写
			& ：被修饰的操作符只能作为输出，它会为此操作数分配一个单独的寄存器
	InputOperands ：输入参数列表，格式如下，当有多个变量时，用逗号隔开：
		[asmSymbolicName] “constraint” (cvariablename)
	Clobbers ：指明修改了那些寄存器或内存，常用的取值如下：
		cc ：表示修改了标志寄存器
		memory ：表示修改了内存
		r0 ~ r15 :表示修改了相应的寄存器
	如下是一段用内联汇编实现的加法函数：
		方法1：
		int add(int a, int b)
		{
			int sum;
			__asm__ volatile (
				"add %[result], %[val1], %[val2]"
				:[result]"=r"(sum)
				:[val1]"r"(a), [val2]"r"(b)
				:"cc"
			);
			return sum;
		}
		方法2：
		int add(int a, int b)
		{
			int sum;
			__asm__ volatile (
				"add %0, %1, %2"
				:"=r"(sum)
				:"r"(a), "r"(b)
				:"cc"
			);
			return sum;
		}
